package demo

import (
	"archive/zip"
	"fmt"
	"io"
	"log"
	"os"
	"server/dao"
	"server/models"
	"server/utils"
	"strconv"
	"time"

	"github.com/360EntSecGroup-Skylar/excelize/v2"
	"github.com/gin-gonic/gin"
)

func Zip(zipFile string, fileList []string) error {
	// 创建 zip 包文件
	fw, err := os.Create(zipFile)
	if err != nil {
		log.Fatal()
	}
	defer fw.Close()

	// 实例化新的 zip.Writer
	zw := zip.NewWriter(fw)
	defer func() {
		// 检测一下是否成功关闭
		if err := zw.Close(); err != nil {
			log.Fatalln(err)
		}
	}()

	for _, fileName := range fileList {
		fr, err := os.Open(fileName)
		if err != nil {
			return err
		}
		fi, err := fr.Stat()
		if err != nil {
			return err
		}
		// 写入文件的头信息
		fh, err := zip.FileInfoHeader(fi)
		w, err := zw.CreateHeader(fh)
		if err != nil {
			return err
		}
		// 写入文件内容
		_, err = io.Copy(w, fr)
		if err != nil {
			return err
		}
	}
	return nil
}

func Unzip(zipFile string) error {
	zr, err := zip.OpenReader(zipFile)
	defer zr.Close()
	if err != nil {
		return err
	}

	for _, file := range zr.File {
		// 如果是目录，则创建目录
		if file.FileInfo().IsDir() {
			if err = os.MkdirAll(file.Name, file.Mode()); err != nil {
				return err
			}
			continue
		}
		// 获取到 Reader
		fr, err := file.Open()
		if err != nil {
			return err
		}

		fw, err := os.OpenFile(file.Name, os.O_CREATE|os.O_RDWR|os.O_TRUNC, file.Mode())
		if err != nil {
			return err
		}
		_, err = io.Copy(fw, fr)
		if err != nil {
			return err
		}
		fw.Close()
		fr.Close()
	}
	return nil
}

func exportUser(fileSrc string) error {
	// 导出用户信息
	var list []*models.AdminUser
	errFind := dao.DB.Model(&models.AdminUser{}).Select([]string{"id", "name", "phone", "status", "created_time", "updated_time"}).Find(&list).Error
	if errFind != nil {
		return errFind
	}
	f := excelize.NewFile()
	// 创建一个工作表
	index := f.NewSheet("Sheet1")
	// 设置单元格的值
	errSetHeader := f.SetSheetRow("Sheet1", "A1", &[]interface{}{"ID", "姓名", "手机号", "新建时间"})
	if errSetHeader != nil {
		return errSetHeader
	}

	for index, val := range list {
		fmt.Println(index, val)
		errSetRow := f.SetSheetRow("Sheet1", "A"+strconv.Itoa(index+2), &[]interface{}{val.ID, val.Name, val.Phone, time.Unix(int64(val.CreatedTime), 0).Format("2006-01-02 15:04:05")})
		if errSetRow != nil {
			fmt.Println(errSetRow)
			break
		}
	}

	// 设置工作簿的默认工作表
	f.SetActiveSheet(index)
	// 根据指定路径保存文件
	if err := f.SaveAs(fileSrc); err != nil {
		fmt.Println(err)
	}

	return nil
}

func exportRole(fileSrc string) error {
	var list []*models.AdminRole
	errFind := dao.DB.Model(&models.AdminRole{}).Select([]string{"id", "name", "created_time", "updated_time"}).Find(&list).Error
	if errFind != nil {
		return errFind
	}
	f := excelize.NewFile()
	// 创建一个工作表
	index := f.NewSheet("Sheet1")
	// 设置单元格的值
	errSetHeader := f.SetSheetRow("Sheet1", "A1", &[]interface{}{"ID", "角色名", "新建时间"})
	if errSetHeader != nil {
		return errSetHeader
	}

	for index, val := range list {
		fmt.Println(index, val)
		errSetRow := f.SetSheetRow("Sheet1", "A"+strconv.Itoa(index+2), &[]interface{}{val.ID, val.Name, time.Unix(int64(val.CreatedTime), 0).Format("2006-01-02 15:04:05")})
		if errSetRow != nil {
			fmt.Println(errSetRow)
			break
		}
	}

	// 设置工作簿的默认工作表
	f.SetActiveSheet(index)
	// 根据指定路径保存文件
	if err := f.SaveAs(fileSrc); err != nil {
		fmt.Println(err)
	}

	return nil
}

func ZipExport(c *gin.Context) {
	userFile := "export_user.xlsx"
	errUser := exportUser(userFile)
	if errUser != nil {
		c.AbortWithError(500, errUser)
		return
	}

	roleFile := "export_role.xlsx"
	errRole := exportRole(roleFile)
	if errRole != nil {
		c.AbortWithError(500, errRole)
		return
	}

	errZip := Zip("demo3.zip", []string{userFile, roleFile})
	if errZip != nil {
		c.AbortWithError(500, errZip)
		return
	}

	c.JSON(
		200,
		utils.DealResponse(utils.Response{
			"data": "ok",
		}),
	)
}

func UnzipHandle(c *gin.Context) {
	err := Unzip("demo.zip")
	if err != nil {
		fmt.Println(err)
	}

	c.JSON(
		200,
		utils.DealResponse(utils.Response{
			"data": "ok",
		}),
	)
}
